#ifndef __LCD_H_
#define __LCD_H_
#include "C51car.h"

#include <reg52.h>
//LCD 接口定义 LCD 相关功能函数定义

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif

#define LCD_DataPort P0
sbit LCD_EN=P2^3;
sbit LCD_RW=P2^1;
sbit LCD_RS=P2^0;


//LCD延时函数
void LCD_Delay()
{
	unsigned char i;
	unsigned char j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	}		
		while (--i);
}
//Command 要写入的命令
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}
//Data 要写入的数据
void LCD_WriteData(unsigned char word)
{
	LCD_RS=1;
	LCD_RW=0;
	LCD_DataPort=word;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}
//LCD1602设置光标位置
//   Line 行位置，范围：1~2
//  Column 列位置，范围：1~16
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
		if(Line==1)
	{
			LCD_WriteCommand(0x80|(Column-1));
	}
	else if(Line==2)
	{
			LCD_WriteCommand(0x80|(Column-1+0x40));
		}
	}


//  LCD1602初始化函数
void LCD_Init()
{
	LCD_WriteCommand(0x38);//八位数据接口，两行显示，5*7点阵
	LCD_WriteCommand(0x0c);//显示开，光标关，闪烁关
	LCD_WriteCommand(0x06);//数据读写操作后，光标自动加一，画面不动
	LCD_WriteCommand(0x01);//光标复位，清屏
}

//  在LCD1602指定位置上显示一个字符
//Line 行位置，范围：1~2
//  Column 列位置，范围：1~16
//  Char 要显示的字符
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
	LCD_SetCursor(Line,Column);
	LCD_WriteData(Char);
}

//  在LCD1602指定位置开始显示所给字符串
//  Line 起始行位置，范围：1~2
//  Column 起始列位置，范围：1~16
//  String 要显示的字符串
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=0;String[i]!='\0';i++)
	{
		LCD_WriteData(String[i]);
	}
}

//  返回值=X的Y次方
int LCD_Pow(int X,int Y)
{
	unsigned char i;
	int Result=1;
	for(i=0;i<Y;i++)
	{
		Result*=X;
	}
	return Result;
}

//  在LCD1602指定位置开始显示所给数字
//  Line 起始行位置，范围：1~2
//  Column 起始列位置，范围：1~16
//  Number 要显示的数字，范围：0~65535
//  Length 要显示数字的长度，范围：1~5
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
	}
}

//  在LCD1602指定位置开始以有符号十进制显示所给数字
//  Line 起始行位置，范围：1~2
//  Column 起始列位置，范围：1~16
//  Number 要显示的数字，范围：-32768~32767
//  Length 要显示数字的长度，范围：1~5
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
	unsigned char i;
	unsigned int Number1;
	LCD_SetCursor(Line,Column);
	if(Number>=0)
	{
		LCD_WriteData('+');
		Number1=Number;
	}
	else
	{
		LCD_WriteData('-');
		Number1=-Number;
	}
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
	}
}

//  在LCD1602指定位置开始以十六进制显示所给数字
//  Line 起始行位置，范围：1~2
//  Column 起始列位置，范围：1~16
//  Number 要显示的数字，范围：0~0xFFFF
//  Length 要显示数字的长度，范围：1~4
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i,SingleNumber;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		SingleNumber=Number/LCD_Pow(16,i-1)%16;
		if(SingleNumber<10)
		{
			LCD_WriteData(SingleNumber+'0');
		}
		else
		{
			LCD_WriteData(SingleNumber-10+'A');
		}
	}
}

//  在LCD1602指定位置开始以二进制显示所给数字
//  Line 起始行位置，范围：1~2
//  Column 起始列位置，范围：1~16
//  Number 要显示的数字，范围：0~1111 1111 1111 1111
//  Length 要显示数字的长度，范围：1~16
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
	}
}




#endif

